# Python 趣味编程：第 12 章
# 例題 12.6 碰撞处理
# --------------------------
# 程序名: 12-collision.py

import pygame

FPS = 60     # Frame per Second每秒帧数
LOOP = True

# 球的绘制函数
def draw_ball(screen, x, y, radius=10):
    return pygame.draw.circle(screen, (255, 255, 0), (x, y), radius)

# 推杆的绘制函数
def draw_paddle(screen, x, y):
    return pygame.draw.rect(screen, (0, 255, 255), (x, y, 40, 100))

screen = pygame.display.set_mode((640, 320))
clock = pygame.time.Clock()   # 时钟对象

x, y= (100, 100)   # 球的初始位置
vx = 10            # 球的速度
paddle_x, paddle_y= (540, 100) # 推杆的初始位置
paddle_vy = 10                 # 推杆的速度

while LOOP:  # 主循环
    for event in pygame.event.get():
        # 处理“关闭”按钮
        if event.type == pygame.QUIT: LOOP = False

    clock.tick(FPS)      # 根据每秒的调用次数延时
    pressed_keys = pygame.key.get_pressed() # 获取key信息
    if pressed_keys[pygame.K_UP]:    # 上箭头被按下时
        paddle_y -= paddle_vy        # y 坐标变小
    if pressed_keys[pygame.K_DOWN]:  # 下箭头被按下时
        paddle_y += paddle_vy        # y 坐标变大
    # パドルを取得する
    paddle_rect = draw_paddle(screen, paddle_x, paddle_y)

    x += vx              # 球的移动
    if not (0 <= x <= 640):  # 离开画面后，改变方向
        vx = -vx
    ball_rect = draw_ball(screen, x, y)   # 球的取得
    if (ball_rect.colliderect(paddle_rect)):
        vx = -vx    # 碰到推杆则反弹球
    pygame.display.flip() # 将推杆和球的绘制反映到画面上
    screen.fill((0, 0, 0))  # 填充：不作用到下一个 flip

pygame.quit()   # 关闭画面
